import axios from 'axios'

import store from '@/store'
import router from '@/router'

import { updateTokenAPI } from '@/api/user'

const ajax = axios.create({
  baseURL: 'http://toutiao.itheima.net'
})

// 请求拦截器
ajax.interceptors.request.use(
  config => {
    const { token, refreshToken } = store.state.user
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    } else if (refreshToken) {
      config.headers.Authorization = `Bearer ${refreshToken}`
    }
    return config
  }, error => {
    return Promise.reject(error)
  })

// 响应拦截器
ajax.interceptors.response.use(
  resp => { // 成功，http状态码以2、3开头走成功回调
    // 今后组件拿到的就是数组，无需多写一层.data
    return resp.data
  }, async error => { // 失败，http状态码以4、5开头走失败回调
    if (['refresh_token失效', 'refresh_token未传']
      .includes(error.response.data.message)) {
      // 2. 重新登录
      // 2.1 清空vuex和本地的token和refreshToken
      store.commit('user/setToken', null)
      store.commit('user/setRefreshToken', null)
      // 2.2 跳转到登录页
      // router.currentRoute 就是 组件 的 $route对象
      /*
        $route: 给组件用的
        router.currentRoute： 给js文件用的
      */
      router.replace(`/login?redirect=${router.currentRoute.path}`)
    }
    if (error.response.status === 401) { // token过期或者无效
      // 1. 尝试做token续签（配合refreshToken)
      // 1.  清空token
      store.commit('user/setToken', null)
      //  2. 调用更新token的接口，拿到一个新的token
      const resp = await updateTokenAPI()
      const { token } = resp.data
      store.commit('user/setToken', token)
      // 3. 用拿到的新的token替换旧toke
      // 4.继续上次未完成的请求
      return ajax(error.config)
    }
    return Promise.reject(error)
  })

export default ajax
